#ifndef DATACENTER_H
#define DATACENTER_H

#include <QObject>
#include "data.h"
#include "../netclient/netclient.h"

namespace model
{

class DataCenter : public QObject
{
    Q_OBJECT
public:
    ~DataCenter();

    // 获取DataCenter对象实例
    static DataCenter* getInstance();

    // 获取服务器的URL
    const QString& getServerURL() const;

    // 获取所有分类
    const KindAndTag* getKindAndTagClassPtr();

    // 获取sessionId
    const QString& getSessionId()const;

    // 设置sessionId
    void setSessionId(const QString& sessionId);

    // 解析响应中的所有视频对象并添加到VideoList中
    void setVideoList(const QJsonObject& videoListJsonObj);

    // 界面通过该指针将视频信息更新到界面
    VideoList* getVideoListPtr();

    // 设置弹幕
    void setBarragesData(const QJsonArray& barrageArray);

    // 获取视频弹幕
    QHash<int64_t, QList<BarrageInfo>>& getBarragesData();

    // 获取和设置当前用户个人信息
    void setMyselfInfo(const QJsonObject& myselfJson);
    UserInfo* getMyselfInfo();

    // 获取和设置其他用户的个人信息
    void setOtherUserInfo(const QJsonObject& myselfJson);
    UserInfo* getOtherUserInfo();

    // 设置用户头像id
    void setAvatar(const QString& fileId);

    // 获取 和 设置用户视频列表
    void setUserVideoList(const QJsonObject& videoListJson);
    VideoList* getUserVideoList();

    // 获取 和 设置状态视频列表
    void setStatusVideoList(const QJsonObject& videoListJson);
    VideoList* getStatusVideoList();

    // 构建临时用户UserInfo信息
    void buildTempUserInfo();

    // 清除用户信息
    void clearUserInfo();

    // 初始化数据⽂件
    void initDataFile();

    // 存储数据到⽂件中
    void saveDataFile();

    // 从数据⽂件中加载数据到内存
    void loadDataFile();

    // 获取和设置管理员列表
    void setAdminList(const QJsonObject& resultJson, bool isAdminStatus = true);
    AdminList* getAdminList();

private:
    explicit DataCenter(QObject *parent = nullptr);

private:
    // 服务器的URL
    const QString serverURL = "http://127.0.0.1:8000";

    // DataCenter对象实例
    static DataCenter* instance;

    // 分类和标签实例指针
    KindAndTag* kindAndTagsPtr = nullptr;

    // 网络客户端
    network::NetClient httpClient;

    // 用户登录的会话ID
    QString loginSessionId;

    // 管理首页获取的视频信息, 首页中: 分类视频列表 标签视频列表 所有视频列表 搜索视频列表
    VideoList* videoListPtr = nullptr;

    // 管理弹幕信息
    QHash<int64_t, QList<BarrageInfo>> barrages;

    // 保存当前用户个人信息
    UserInfo* myselfInfo = nullptr;

    // 保存其他用户个人信息
    UserInfo* otherUserInfo = nullptr;

    // 保存指定用户的视频列表：我的视频列表 或 其他用户视频列表
    VideoList* userVideoList = nullptr;

    // 状态视频列表--给视频审核页面使用
    VideoList* statusVideoList = nullptr;

    // 管理员列表
    AdminList* adminList = nullptr;

public:
    // 所有异步请求方法
    void helloAsync();
    void pingAsync();

    // 临时⽤⼾登录
    void loginTempUserAsync();

    // 获取所有视频的列表
    void getAllVideoListAsync();

    // 获取该分类下的视频列表
    void getAllVideoListInKindAsync(int kindId);

    // 获取该标签下的视频列表
    void getAllVideoListInTagAsync(int tagId);

    // 获取该搜索下的视频列表
    void getAllVideoListInSearchAsync(const QString& searchText);

    // 下载图⽚
    void downloadPhotoAsync(const QString& photoFileId);

    // 下载视频文件
    void downloadVideoAsync(const QString& videoFileId);

    // 上传视频
    void uploadVideoAsync(const QString& videoPath);

    // 获取弹幕
    void getVideoBarrageAsync(const QString& videoId);

    // 更新播放数量
    void setPlayNumberAsync(const QString& videoId);

    // 检测视频是否被点赞过
    void getIsLikeVdieoAsync(const QString& videoId);

    // 更新点赞数据
    void setLikeNumberAsync(const QString& videoId);

    // 新增弹幕
    void loadupBarrageAsync(const QString& videoId, const BarrageInfo& barrageInfo);

    // 获取用户个人信息
    void getMyselfInfoAsync();

    // 获取其他用户信息
    void getOtherUserInfoAsync(const QString& userId);

    // 上传图片
    void uploadPhotoAsync(const QByteArray& photoData, QWidget* whichPage);

    // 修改用户头像id
    void setAvatarAsync(const QString& fileId);

    // 获取用户视频列表: 当前用户 或 其他用户
    // userId: 空表示获取当前用户视频列表  否则获取其他用户视频列表
    void getUserVideoListAsync(const QString& userId, int pageIndex, const QString& whichPage);

    // 删除视频
    void deleteVideoAsync(const QString& videoId);

    // 关注⽤⼾
    void newAttentionAsync(const QString& userId);

    // 取消关注⽤⼾
    void delAttentionAsync(const QString& userId);

    // 获取验证码
    void getAuthcodeAsync(const QString& phoneNum);

    // 短信登录
    void loginWithMessageAsync(const QString& phoneNum, const QString& authcode, const QString& authcodeId);

    // 账号密码登录
    void loginWithPasswordAsync(const QString& phoneNum, const QString& password);

    // 会话登录
    void loginSessionAsync();

    // 退出登录
    void logoutAsync();

    // 设置密码
    void setPasswordAsync(const QString& password);

    // 设置昵称
    void setNicknameAsync(const QString& nickname);

    // 新增视频信息
    void uploadVideoDescAsync(const VideoDesc& videoDesc);

    // 获取状态视频列表
    void getStatusVideoListAsync(model::VideoStatus videoStatus, int pageIndex);

    // 视频审核
    void checkVideoAsync(const QString& videoId, bool result);

    // 上架视频
    void putawayVideoAsync(const QString& videoId);

    // 下架视频
    void discardVideoAsync(const QString& videoId);

    // 获取管理员信息--通过手机号
    void getAdminInfoByPhoneAsync(const QString& phoneNumber);

    // 获取管理员信息--通过状态
    void getAdminInfoByStatusAsync(int pageIndex, AdminStatus adminStatus);

    // 新增管理员
    void newAdminAsync(const AdminInfo& adminInfo);

    // 编辑管理员
    void editAdminAsync(const AdminInfo& adminInfo);

    // 修改管理员状态
    void setAdminStatusAsync(const AdminInfo& adminInfo);

    // 删除管理员
    void delAdminAsync(const QString& userId);

signals:
    void helloDone();
    void pingDone();

    // 临时⽤⼾登录完成
    void loginTempUserDone();

    // 获取所有视频列表完成
    void getAllVideoListDone();

    // 获取该分类下的视频列表完成
    void getAllVideoListInKindDone();

    // 获取该标签下的视频列表完成
    void getAllVideoListInTagDone();

    // 获取该搜索下的视频列表完成
    void getAllVideoListInSearchDone();

    // 下载图⽚处理完毕
    // 每个VideoBox上都要下载视频封⾯和图⽚，导致下载图⽚完成信号会被绑定多次
    // ⼀个信号被绑定多次时，当该信号触发时会被执⾏多次
    // 添加imageId参数，表明是某控件触发的下载图⽚请求，才处理该次图⽚下载的界⾯显⽰
    void downloadPhotoDone(const QString& imageId, QByteArray imageData);

    // 上传图片
    void uploadPhotoDone(const QString& fileId, QWidget* whichPage);

    // 下载视频完毕
    void downloadVideoDone(const QString& videoId, const QString& videoPath);

    // 获取弹幕
    void getVideoBarrageDone(const QString& videoId);

    // 检测视频是否被点赞过
    void getIsLikeVdieoDone(const QString& videoId, bool isLike);

    // 获取⽤⼾个⼈信息, 数据保存到 DataCenter 中
    void getMyselfInfoDone();

    // 获取其他⽤⼾信息，数据保存到 DataCenter 中
    void getOtherUserInfoDone();

    // 修改用户头像Id
    void setAvatarDone();

    // 获取用户视频列表
    void getUserVideoListDone(const QString& userId, const QString& whichPage);

    // 删除视频
    void deleteVideoDone(const QString& videoId);

    // 关注⽤⼾
    void newAttentionDone();

    // 取消关注⽤⼾
    void delAttentionDone();

    // 获取验证码成功
    void getAuthcodeDone(const QString& codeId);

    // 短信登录成功
    void loginWithMessageDone();

    // 短信登录失败
    void loginWithMessageFailed(const QString& errorInfo);

    // 账号密码登录成功
    void loginWithPasswordDone();

    // 账号密码登录失败
    void loginWithPasswordFailed(const QString& errorInfo);

    // 会话登录成功
    void loginSessionDone(bool isTempUser);

    // 会话登录失败
    void loginSessionFailed(const QString& errorInfo);

    // 退出成功
    void logoutDone();

    // 设置密码成功
    void setPasswordDone();

    // 设置昵称成功
    void setNicknameDone(const QString& nickname);

    // 上传视频完成
    void uploadVideoDone(const QString& videoId);

    // 新增视频信息完成
    void uploadVideoDescDone();

    // 获取状态视频列表完成
    void getStatusVideoListDone();

    // 视频审核完成
    void checkVideoDone();

    // 上架视频完成
    void putawayVideoDone();

    // 下架视频完成
    void discardVideoDone();

    // 获取管理员信息完成--通过手机号
    void getAdminInfoByPhoneDone();

    // 获取管理员信息完成--通过状态
    void getAdminInfoByStatusDone();

    // 新增管理员完成
    void newAdminDone();

    // 编辑管理员完成
    void editAdminDone();

    // 修改管理员状态完成
    void setAdminStatusDone();

    // 删除管理员完成
    void delAdminDone();
};

} // end model

#endif // DATACENTER_H
